/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package occho.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import occho.model.Asignatura;
import occho.model.Usuario;

/**
 *
 * @author Jorge
 */
public class OracleUsuarioDAO implements UsuarioDAO {
    
    private Connection conn = null;
    
    /**
     * Constructor de la clase.
     * @param conn
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public OracleUsuarioDAO(Connection conn) throws ClassNotFoundException, SQLException {
        this.conn = conn;
    }

    @Override
    public boolean insertarUsuario(Usuario usuario) throws SQLException, ClassNotFoundException {
        // Comprobamos si existe el usuario
        if (existeUsuario(usuario.getEmail()))
            return false;
        
        String sql = null;
        PreparedStatement stmt = null;
        
        if (usuario.getTipo().equals(Usuario.ADMIN)) {
            sql = "insert into " + usuario.getTipo() + 
                    " (id, email, password, nombre) values (seq_admin.nextval,?,?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.clearParameters();
            stmt.setString(1, usuario.getEmail());
            stmt.setString(2, usuario.getPassword());
            stmt.setString(3, usuario.getNombre());
        }
        else if (usuario.getTipo().equals(Usuario.PROFESOR)) {
            sql = "insert into " + usuario.getTipo() + 
                    " (id, nombre, apellidos, email, password) values (seq_profesor.nextval,?,?,?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.clearParameters();
            stmt.setString(1, usuario.getNombre());
            stmt.setString(2, usuario.getApellidos());
            stmt.setString(3, usuario.getEmail());
            stmt.setString(4, usuario.getPassword());
        }
        else {
            sql = "insert into " + usuario.getTipo() + 
                    " (id, nombre, apellidos, email, password) values (seq_alumno.nextval,?,?,?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.clearParameters();
            stmt.setString(1, usuario.getNombre());
            stmt.setString(2, usuario.getApellidos());
            stmt.setString(3, usuario.getEmail());
            stmt.setString(4, usuario.getPassword());
        }
        
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        }
        else { 
            stmt.close();
            return false;
        }
    }

    @Override
    public List<Usuario> seleccionarUsuarios(String tipo) throws SQLException {
        String sql = "select * from " + tipo;
        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        List<Usuario> usuarios = new Vector<Usuario>();
        
        while (rs.next()) {
            usuarios.add(new Usuario(rs.getInt("id"), rs.getString("nombre"), 
                    tipo.equals(Usuario.ADMIN) ? null : rs.getString("apellidos"), 
                    rs.getString("email"), rs.getString("password"), tipo));
        }
        rs.close();
        stmt.close();
        return usuarios;
    }

    @Override
    public boolean eliminarUsuario(Usuario usuario) throws SQLException {
        String sql = "delete from " + usuario.getTipo() + "_v where id=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setInt(1, usuario.getIdUsuario());
        boolean eliminado = stmt.executeUpdate() == 1;
        stmt.close();
        return eliminado;
    }

    @Override
    public boolean modificarUsuario(Usuario usuario) throws SQLException {
        PreparedStatement stmt = null;
        boolean actualizado = false;
        if (usuario.getTipo().equals(Usuario.ADMIN)) {
            String sql = "update " + usuario.getTipo() 
                    + " set nombre=?, email=?, password=? where id=?";
            stmt = conn.prepareStatement(sql);
            stmt.clearParameters();
            stmt.setString(1, usuario.getNombre());
            stmt.setString(2, usuario.getEmail());
            stmt.setString(3, usuario.getPassword());
            stmt.setInt(4, usuario.getIdUsuario());
            
            actualizado = stmt.executeUpdate() == 1;
        }
        else {
            String sql = "update " + usuario.getTipo() 
                    + " set nombre=?, apellidos=?, email=?, password=? where id=?";
            stmt = conn.prepareStatement(sql);
            stmt.clearParameters();
            stmt.setString(1, usuario.getNombre());
            stmt.setString(2, usuario.getApellidos());
            stmt.setString(3, usuario.getEmail());
            stmt.setString(4, usuario.getPassword());
            stmt.setInt(5, usuario.getIdUsuario());
            
            actualizado = stmt.executeUpdate() == 1;
        }
        stmt.close();
        return actualizado;
    }

    @Override
    public Usuario seleccionarUsuario(String email) throws SQLException, ClassNotFoundException {
        Usuario usuario = selectAdmin(email);
        if (usuario == null) {
            usuario = selectProfesor(email);
            if (usuario == null) {
                usuario = selectAlumno(email);
            }
        }
        return usuario;
    }
    
    @Override
    public boolean existeUsuario(String email) throws SQLException, ClassNotFoundException {
        return (seleccionarUsuario(email) != null);
    }
    
    
    private Usuario selectAdmin(String email) throws SQLException {
        String sql = "select * from administrador where email=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setString(1, email);
        ResultSet rs = stmt.executeQuery();
        Usuario usuario = null;
        
        if (rs.next()) {
            usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt("id"));
            usuario.setNombre(rs.getString("nombre"));
            usuario.setTipo(Usuario.ADMIN);
            usuario.setPassword(rs.getString("password"));
            usuario.setEmail(email);
        }
        rs.close();
        stmt.close();
        return usuario;
    }
    
    private Usuario selectProfesor(String email) throws SQLException, ClassNotFoundException {
        String sql = "select * from profesor where email=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setString(1, email);
        ResultSet rs = stmt.executeQuery();
        Usuario usuario = null;
        
        if (rs.next()) {
            usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt("id"));
            usuario.setNombre(rs.getString("nombre"));
            usuario.setApellidos(rs.getString("apellidos"));
            usuario.setTipo(Usuario.PROFESOR);
            usuario.setPassword(rs.getString("password"));
            usuario.setEmail(email);
            
            OracleDAOFactory daoFactory =OracleDAOFactory.getInstancia();
            AsignaturaDAO asignaturaDAO = daoFactory.getAsignaturaDAO();
            
            List<Asignatura> asignaturas = asignaturaDAO.seleccionarAsignaturas(usuario);
            usuario.setAsignaturas(asignaturas);
        }
        rs.close();
        stmt.close();
        
        return usuario;
    }
    
    public Usuario selectAlumno(String email) throws SQLException, ClassNotFoundException {
        String sql = "select * from alumno where email=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setString(1, email);
        ResultSet rs = stmt.executeQuery();
        Usuario usuario = null;
        
        if (rs.next()) {
            usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt("id"));
            usuario.setNombre(rs.getString("nombre"));
            usuario.setApellidos(rs.getString("apellidos"));
            usuario.setTipo(Usuario.ALUMNO);
            usuario.setPassword(rs.getString("password"));
            usuario.setEmail(email);
            
            OracleDAOFactory daoFactory = OracleDAOFactory.getInstancia();
            AsignaturaDAO asignaturaDAO = daoFactory.getAsignaturaDAO();
            
            List<Asignatura> asignaturas = asignaturaDAO.seleccionarAsignaturas(usuario);
            usuario.setAsignaturas(asignaturas);
        }
        rs.close();
        stmt.close();
        
        return usuario;
    }

    public boolean estaLogueadoAlumno(String email) throws SQLException, ClassNotFoundException {
        String sql = "select * from alumno where email=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setString(1, email);
        ResultSet rs = stmt.executeQuery();
        boolean activo = false;
        
        if (rs.next()) {
            activo = rs.getBoolean("activo");
        }
        rs.close();
        stmt.close();
        
        return activo;
    }

    public boolean setActivo(String email, boolean b) throws SQLException {
        String sql = "update alumno set activo=? where email=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.clearParameters();
        stmt.setBoolean(1, b);
        stmt.setString(2, email);
                
        if (stmt.executeUpdate() > 0) {
            stmt.close();
            return true;
        }
        else{
            stmt.close();
            return false;
        }  
    }
    
    /**
     * Devuelva una lista de alumnos cuyos ids estan en la lista de ids
     * @param listaIdsAlumnos
     * @return ArrayList<Usuario>
     * @throws SQLException
     */
    public ArrayList<Usuario> seleccionarAlumnos(ArrayList<Integer> listaIdsAlumnos) throws SQLException{
        String sql = "select * from alumno where id=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        Usuario usuario = null;
        ArrayList<Usuario> listaUsuarios=new ArrayList<Usuario>();
        for(int i: listaIdsAlumnos){
            stmt.clearParameters();
            stmt.setInt(1, i);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("id"));
                usuario.setNombre(rs.getString("nombre"));
                usuario.setApellidos(rs.getString("apellidos"));
                usuario.setPassword(rs.getString("password"));
                listaUsuarios.add(usuario);
            }
        }
        return listaUsuarios;
    }
}

